Promises 教程

1. 什么是 Promises?

在 JavaScript 中,Promise 是一种用于处理异步操作的对象。它代表了一个异步操作的最终完成(或失败)及其结果值。Promise 提供了一种更清晰、更简洁的方式来处理异步代码,避免了“回调地狱”(callback hell)的问题。

1.1 Promise 的状态

一个 Promise 有三种状态:

  • Pending(进行中): 初始状态,既不是成功,也不是失败。
  • Fulfilled(已成功): 意味着操作成功完成。
  • Rejected(已失败): 意味着操作失败。

1.2 Promise 的基本结构

const myPromise = new Promise((resolve, reject) => {
    // 异步操作
    if (/* 操作成功 */) {
        resolve(value); // 成功时调用 resolve
    } else {
        reject(error); // 失败时调用 reject
    }
});

2. 创建和使用 Promise

2.1 创建一个简单的 Promise

const promise = new Promise<string>((resolve, reject) => {
    setTimeout(() => {
        resolve("操作成功!");
    }, 1000);
});

2.2 使用 .then() 和 .catch() 处理 Promise

promise
    .then((message) => {
        console.log(message); // 输出: 操作成功!
    })
    .catch((error) => {
        console.error(error);
    });

2.3 链式调用 .then()

promise
    .then((message) => {
        console.log(message); // 输出: 操作成功!
        return "下一步操作";
    })
    .then((nextMessage) => {
        console.log(nextMessage); // 输出: 下一步操作
    })
    .catch((error) => {
        console.error(error);
    });

3. Promise 的静态方法

3.1 Promise.resolve()

const resolvedPromise = Promise.resolve("立即成功");
resolvedPromise.then((value) => console.log(value)); // 输出: 立即成功

3.2 Promise.reject()

const rejectedPromise = Promise.reject("立即失败");
rejectedPromise.catch((error) => console.error(error)); // 输出: 立即失败

3.3 Promise.all()

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
    console.log(values); // 输出: [3, 42, "foo"]
});

3.4 Promise.race()

const promise1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then((value) => {
    console.log(value); // 输出: "two"
});

4. 实践练习

4.1 练习:模拟异步数据加载

编写一个 Promise,模拟从服务器加载数据。如果数据加载成功,返回数据;如果失败,返回错误信息。

function fetchData(url: string): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (url === "https://api.example.com/data") {
                resolve("数据加载成功!");
            } else {
                reject("数据加载失败!");
            }
        }, 2000);
    });
}

fetchData("https://api.example.com/data")
    .then((data) => console.log(data))
    .catch((error) => console.error(error));

4.2 练习:使用 Promise.all() 并行加载多个资源

编写一个函数,使用 Promise.all() 并行加载多个资源,并在所有资源加载完成后输出结果。

function loadResource(url: string): Promise<string> {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(`资源 ${url} 加载成功!`);
        }, Math.random() * 2000);
    });
}

const resources = [
    "https://api.example.com/resource1",
    "https://api.example.com/resource2",
    "https://api.example.com/resource3"
];

Promise.all(resources.map(loadResource))
    .then((results) => {
        console.log(results);
    })
    .catch((error) => {
        console.error(error);
    });

5. 总结

Promise 是处理异步操作的一种强大工具,它使得异步代码更加清晰和易于管理。通过本教程,你应该已经掌握了如何创建和使用 Promise,以及如何使用 Promise 的静态方法来处理多个异步操作。

在接下来的课程中,我们将学习如何使用 Async/Await 进一步简化异步代码的处理。